﻿Public Class ABMProductos
    Dim acceso As New acceso
    Dim esNuevo As Boolean
    Dim comando As New SqlClient.SqlCommand
    Dim funciones As New Funciones
    Dim Producto As New Producto()
    Private Sub txt_nombre_producto_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txt_nombre_producto.TextChanged, txt_cod_producto.TextChanged

    End Sub

    Private Sub ABMProductos_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        acceso.cargarCombo(cmb_Marca, "Marca", "nombre", "idMarca")
        acceso.cargarCombo(cmb_Tipo_Producto, "TipoProducto", "nombre", "idTipoProducto")
        acceso.cargarCombo(cmb_unidad_medida, "UnidadMedida", "nombre", "idUnidadMedida")
        cargarGrilla()
        esNuevo = True
        blanquear()
        txt_nombre_producto.Focus()
    End Sub
    Private Sub cargarGrilla()

        Dim tabla As New Data.DataTable()
        tabla = acceso.leo_tabla("VistaProductos")
        dgv_Productos.DataSource = tabla
        acomodarGrilla()
    End Sub

    Public Sub insertProducto(ByVal producto As Producto)
        Dim sql As String
        sql = "Insert INTO Producto (nombre,descripcion,stockActual,stockDisponible,stockReservado,"
        sql &= " stockRiesgo,precio,idUnidad,idTipoProducto,idMarca)"
        sql &= " VALUES (@nombre , @descripcion ,0,0, 0, @stockRiesgo, @precio, @unidad, @tipoProducto, @marca)"
        comando = New Data.SqlClient.SqlCommand
        comando.Parameters.AddWithValue("@nombre", producto._nombre)
        comando.Parameters.AddWithValue("@descripcion", producto._descripcion)
        comando.Parameters.AddWithValue("@stockRiesgo", producto._stockRiesgo)
        comando.Parameters.AddWithValue("@precio", producto._precio)
        comando.Parameters.AddWithValue("@unidad", producto._Unidad._idUnidadMedida)
        comando.Parameters.AddWithValue("@tipoProducto", producto._tipoProducto._idTipoProducto)
        comando.Parameters.AddWithValue("@marca", producto._marca._idMarca)
        acceso.ejecutarActualizaciones(sql, comando)
    End Sub

    Public Sub updateProducto(ByVal producto As Producto)
        Dim sql As String
        sql = "UPDATE Producto SET nombre = @nombre, descripcion = @descripcion, stockRiesgo = @stockRiesgo"
        sql &= ", precio = @precio, idUnidad = @unidad, idTipoProducto = @tipoProducto, idMarca = @marca where codProducto = @codProducto"
        comando = New Data.SqlClient.SqlCommand
        comando.Parameters.AddWithValue("@nombre", producto._nombre)
        comando.Parameters.AddWithValue("@descripcion", producto._descripcion)
        comando.Parameters.AddWithValue("@stockRiesgo", producto._stockRiesgo)
        comando.Parameters.AddWithValue("@precio", producto._precio)
        comando.Parameters.AddWithValue("@unidad", producto._Unidad._idUnidadMedida)
        comando.Parameters.AddWithValue("@tipoProducto", producto._tipoProducto._idTipoProducto)
        comando.Parameters.AddWithValue("@marca", producto._marca._idMarca)
        comando.Parameters.AddWithValue("@codProducto", producto._codProducto)
        acceso.ejecutarActualizaciones(sql, comando)
    End Sub
    Private Sub acomodarGrilla()
        dgv_Productos.Columns("codProducto").HeaderText = "Codigo Producto"
        dgv_Productos.Columns("codProducto").Width = 60
        dgv_Productos.Columns("nombre").HeaderText = "Nombre"
        dgv_Productos.Columns("descripcion").HeaderText = "Descripcion"
        dgv_Productos.Columns("stockRiesgo").HeaderText = "Stock de Riesgo"
        dgv_Productos.Columns("unidadMedida").HeaderText = "Unidad de Medida"
        dgv_Productos.Columns("precio").HeaderText = "Precio"
        dgv_Productos.Columns("precio").Width = 60
        dgv_Productos.Columns("marca").HeaderText = "Marca"
        dgv_Productos.Columns("tipoProducto").HeaderText = "Tipo de Producto"
        dgv_Productos.Columns("idTipoProducto").Visible = False
        dgv_Productos.Columns("idMarca").Visible = False
        dgv_Productos.Columns("idUnidadMedida").Visible = False
        dgv_Productos.Columns("stockActual").Visible = False
        dgv_Productos.Columns("stockDisponible").Visible = False
        dgv_Productos.Columns("stockReservado").Visible = False

    End Sub

    Private Sub dgv_Productos_DoubleClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles dgv_Productos.Click
        If dgv_Productos.SelectedRows.Count <> 0 Then
            txt_cod_producto.Text = dgv_Productos.SelectedRows(0).Cells("codProducto").Value
            txt_nombre_producto.Text = dgv_Productos.SelectedRows(0).Cells("nombre").Value
            txt_descripcion_producto.Text = dgv_Productos.SelectedRows(0).Cells("descripcion").Value
            txt_precio.Text = dgv_Productos.SelectedRows(0).Cells("precio").Value
            txt_stock_riesgo.Text = dgv_Productos.SelectedRows(0).Cells("stockRiesgo").Value
            cmb_Marca.SelectedValue = dgv_Productos.SelectedRows(0).Cells("idMarca").Value
            cmb_Tipo_Producto.SelectedValue = dgv_Productos.SelectedRows(0).Cells("idTipoProducto").Value
            cmb_unidad_medida.SelectedValue = dgv_Productos.SelectedRows(0).Cells("idUnidadMedida").Value
            esNuevo = False
        End If

    End Sub

    Private Sub btn_nuevo_Click(sender As System.Object, e As System.EventArgs) Handles btn_nuevo.Click
        esNuevo = True
        blanquear()

    End Sub

    Private Sub blanquear()
        txt_cod_producto.Text = ""
        txt_nombre_producto.Text = ""
        txt_descripcion_producto.Text = ""
        txt_precio.Text = ""
        txt_stock_riesgo.Text = ""
        cmb_Marca.SelectedIndex = -1
        cmb_Tipo_Producto.SelectedIndex = -1
        cmb_unidad_medida.SelectedIndex = -1
        txt_nombre_producto.Focus()
    End Sub

    Private Sub btn_salir_Click(sender As System.Object, e As System.EventArgs) Handles btn_salir.Click
        If MessageBox.Show("¿ Desea salir del ABM de Productos ?", "Atención", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then
            Me.Close()
        End If
    End Sub

    Private Sub btn_guardar_Click(sender As System.Object, e As System.EventArgs) Handles btn_guardar.Click
        'Validaciones
        If txt_nombre_producto.Text = "" Then
            MessageBox.Show("El campo Nombre no puede estar vacio", "Atención", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            txt_nombre_producto.Focus()
            Return
        End If
        If txt_descripcion_producto.Text = "" Then
            MessageBox.Show("El campo Descripcion no puede estar vacio", "Atención", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            txt_descripcion_producto.Focus()
            Return
        End If
        If cmb_unidad_medida.SelectedIndex = -1 Then
            MessageBox.Show("Debe seleccionar alguna unidad de medida", "Atención", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            cmb_unidad_medida.Focus()
            Return
        End If
        If txt_stock_riesgo.Text = "" Then
            MessageBox.Show("El campo Stock de Riesgo no puede estar vacio", "Atención", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            txt_stock_riesgo.Focus()
            Return
        End If
        If Not IsNumeric(txt_stock_riesgo.Text) Then
            MessageBox.Show("El Stock de riesgo debe ser numerico", "Atención", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            txt_stock_riesgo.Focus()
            Return
        End If
        If cmb_Tipo_Producto.SelectedIndex = -1 Then
            MessageBox.Show("Debe seleccionar algun tipo de producto", "Atención", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            cmb_Tipo_Producto.Focus()
            Return
        End If
        If txt_precio.Text = "" Then
            MessageBox.Show("El campo Precio no puede estar vacio", "Atención", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            txt_precio.Focus()
            Return
        End If
        If Not IsNumeric(txt_precio.Text) Then
            MessageBox.Show("El precio debe ser numerico", "Atención", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            txt_precio.Focus()
            Return
        End If
        
        If cmb_Marca.SelectedIndex = -1 Then
            MessageBox.Show("Debe seleccionar alguna Marca", "Atención", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            cmb_Marca.Focus()
            Return
        End If


        Producto._nombre = txt_nombre_producto.Text
        Producto._descripcion = txt_descripcion_producto.Text
        Producto._precio = 0 & txt_precio.Text
        Producto._stockRiesgo = 0 & txt_stock_riesgo.Text
        Producto._marca._idMarca = Int(cmb_Marca.SelectedValue.ToString())
        Producto._marca._nombre = cmb_Marca.SelectedText
        Producto._tipoProducto._idTipoProducto = Int(cmb_Tipo_Producto.SelectedValue.ToString())
        Producto._tipoProducto._nombre = cmb_Tipo_Producto.SelectedText
        Producto._Unidad._idUnidadMedida = Int(cmb_unidad_medida.SelectedValue.ToString())
        Producto._Unidad._nombre = cmb_unidad_medida.SelectedText
        If esNuevo = True Then
            insertProducto(Producto)
            cargarGrilla()
            blanquear()
            MessageBox.Show("Nuevo Producto cargado con exito", "ATENCION", MessageBoxButtons.OK, MessageBoxIcon.Information)
        Else
            Producto._codProducto = txt_cod_producto.Text
            updateProducto(Producto)
            cargarGrilla()
            blanquear()
            MessageBox.Show("Producto actualizado con exito", "ATENCION", MessageBoxButtons.OK, MessageBoxIcon.Information)
        End If


    End Sub

    Private Sub btn_eliminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_eliminar.Click
        If dgv_Productos.SelectedRows.Count <> 0 Then
            Dim producto As New Producto
            producto._codProducto = dgv_Productos.CurrentRow.Cells("codProducto").Value
            producto._nombre = dgv_Productos.CurrentRow.Cells("nombre").Value
            If MessageBox.Show("Esta seguro que desea eliminar el producto: " & producto._nombre, "ATENCION", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) = Windows.Forms.DialogResult.Yes Then
                deleteProducto(producto)
                cargarGrilla()
                blanquear()
            End If
        End If
    End Sub


    Public Sub deleteProducto(ByVal producto As Producto)
        Dim sql As String
        sql = "Delete Producto where codProducto = @codProducto"
        comando = New Data.SqlClient.SqlCommand
        comando.Parameters.AddWithValue("@codProducto", producto._codProducto)
        acceso.ejecutarActualizaciones(sql, comando)


    End Sub


    
    Private Sub txt_stock_riesgo_KeyPress(ByVal eventSender As System.Object, ByVal eventArgs As System.Windows.Forms.KeyPressEventArgs) Handles txt_stock_riesgo.KeyPress
        eventArgs.Handled = funciones.validarDouble(eventArgs.KeyChar, txt_stock_riesgo.Text & CChar(eventArgs.KeyChar))
    End Sub

    Private Sub txt_precio_KeyPress(ByVal eventSender As System.Object, ByVal eventArgs As System.Windows.Forms.KeyPressEventArgs) Handles txt_precio.KeyPress
        eventArgs.Handled = funciones.validarDouble(eventArgs.KeyChar, txt_precio.Text & CChar(eventArgs.KeyChar))
    End Sub

   
    Private Sub btn_Nueva_Unidad_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Nueva_Unidad.Click
        ABM_Unidad_Medida.ShowDialog()
        acceso.cargarCombo(cmb_unidad_medida, "UnidadMedida", "nombre", "idUnidadMedida")
    End Sub


    Private Sub btn_Nuevo_Tipo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Nuevo_Tipo.Click
        ABM_Tipo_Producto.ShowDialog()
        acceso.cargarCombo(cmb_Tipo_Producto, "TipoProducto", "nombre", "idTipoProducto")
    End Sub

    Private Sub btn_Nueva_Marca_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Nueva_Marca.Click
        AMB_Marca.ShowDialog()
        acceso.cargarCombo(cmb_Marca, "Marca", "nombre", "idMarca")
    End Sub
End Class